import pandas as pd							#导入pandas模块
import matplotlib.pyplot as plt			#导入pyplot模块

df = pd.read_excel('某电商网站手机销售数据.xlsx')

#定义函数，处理评价数中的字符
def dealComment_num(comm_colum):
    num = comm_colum
    if type(num) == str:
        num = num.replace('+', '')
        if '万' in num:
            if '.' in num:
                num = num.replace('.', '').replace('万', '000')
            else:
                num = num.replace('万', '0000')
    return num
#筛选出标明价格的手机
df = df[~df['价格'].str.contains('待发布')]
#处理价格中的‘￥’字符
df['价格'] = df['价格'].str.replace('￥', '')

#将价格转化为浮点型
df['价格'] = df['价格'].astype('float')
df.dropna(inplace=True)
#使用lambda调用dealComment_num函数
df['评价数'] = df['评价数'].apply(lambda x: dealComment_num(x))
#将评价数转化为整型
df['评价数'] = df['评价数'].astype('int')

#正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']

#绘制手机价格分布区间直方图
plt.figure(figsize=(10, 8))			#生成绘图窗口
plt.hist(df['价格'], bins=50, color='deeppink')
plt.xlabel('价格(元)')					#添加x轴标题
plt.ylabel('数量（台）')					#添加y轴标题
plt.title('手机价格分布')				#添加窗口标题

num_total = str(df.shape[0])		#计算样本总数
s = '样本总数为' + num_total			#初始化字符串s
#添加样本总数说明
plt.text(20000, 400, s, fontsize=15, color='deeppink')



#提取包含mate40的商品信息
mate40 = df[df['商品名'].str.contains('mate40') | df['商品名'].str.contains('mate 40')
            | df['商品名'].str.contains('Mate40') | df['商品名'].str.contains('Mate 40')]
#计算mate40的总评价数
mate40_total = mate40['评价数'].sum()
#计算mate40的均价
mate40_price = int(mate40['价格'].mean())

#提取包含p50的商品信息
p50 = df[df['商品名'].str.contains('p50') | df['商品名'].str.contains('p 50')
         | df['商品名'].str.contains('P50') | df['商品名'].str.contains('P 50')]
#计算p50的总评价数
p50_total = p50['评价数'].sum()
#计算p50的均价
p50_price = int(p50['价格'].mean())

#提取包含nova9的商品信息
nova9 = df[df['商品名'].str.contains('nova9') | df['商品名'].str.contains('nova 9')]
#计算nova9的总评价数
nova9_total = nova9['评价数'].sum()
#计算nova9的均价
nova9_price = int(nova9['价格'].mean())

#提取包含畅享20的商品信息
畅享20 = df[df['商品名'].str.contains('畅享20') | df['商品名'].str.contains('畅享 20')]
#计算畅享20的总评价数
畅享20_total = 畅享20['评价数'].sum()
#计算畅享20的均价
畅享20_price= int(畅享20['价格'].mean())

#初始化标签列表
title_list = ['Mate40', 'P50', 'nova9', '畅享20']
#初始化评价数列表
sale_list = [mate40_total, p50_total, nova9_total, 畅享20_total]
#初始化均价列表
price_list = [mate40_price, p50_price, nova9_price, 畅享20_price]

#绘制华为各系列手机销量柱状图
plt.figure(figsize=(10, 8), dpi=80)	#生成绘制柱状图窗口
#根据sale_list列表绘制图
plt.bar(range(4), sale_list, width=0.5, color='deeppink')
plt.xticks(range(4), title_list)		#在每个长条下方添加手机系列
plt.ylabel('销量（台）')					#添加x轴标题
plt.xlabel('型号')						#添加y轴标题
plt.title('华为各系列手机销量')			#添加窗口标题
#在长条上方添加评价数
for x, y in enumerate(sale_list):
    plt.text(x, float(y) + 0.1, y, ha='center')

#绘制华为各系列手机均价柱状图
plt.figure(figsize=(10, 8), dpi=80)	#生成绘制柱状图窗口
#根据price_list列表绘制图
plt.bar(range(4), price_list, width=0.5, color='deeppink')
plt.xticks(range(4), title_list)		#在每个长条下方添加手机型号
plt.ylabel('均价（元）')					#添加x轴标题
plt.xlabel('型号')						#添加y轴标题
plt.title('华为各系列手机均价')			#添加窗口标题
#在长条上方添加均价
for x, y in enumerate(price_list):
    plt.text(x, float(y) + 0.1, y, ha='center')


plt.figure()
#以店铺名分组
shops = df.groupby('店铺名', as_index=False)
#每一组评价数求和
shops = shops.agg({'评价数': 'sum'})
#总的评价数求和
comment_total = shops['评价数'].sum()

#计算每个店铺评价数比例
shops['评价数比例'] = shops['评价数']*100/comment_total
#按评价比例降序排序
shops = shops.sort_values('评价数比例', ascending=False)
#取出评价数比例前10的店铺
top10 = shops.head(10)

label_list = list(top10['店铺名'])				#定义标签列表
label_list.append('其他')
size_list = list(top10['评价数比例'])				#定义大小列表
size_list.append(100-sum(size_list))
color = ['red', 'green', 'blue', 'orange', 'turquoise', 'sienna',
         'pink', 'gray', 'gold', 'fuchsia', 'dodgerblue']	#定义各部分颜色
#绘制饼状图
patches, l_text, p_text = plt.pie(size_list, colors=color, labels=label_list,
                                  labeldistance=1.1, autopct="%1.1f%%",
                                  shadow=False, startangle=90, pctdistance=0.6)
plt.axis('equal')							#设置横轴和纵轴大小相等
plt.show()									#显示绘图



